local Workspace = game:GetService("Workspace")
local CommonOHOH = _G.CommonOHOH;
local M = CommonOHOH.class.new(script, CommonOHOH.files.BaseObject());
local level_cfg=_G.CommonOHOH.config.Level
local game_cfg=_G.CommonOHOH.config.Game

local OrbitClass=require(script.Orbit) --管道
local MineClass=require(script.Mine) --矿石
local BoxClass=require(script.Box) --宝箱

local TrackAttRoot=game.Workspace:WaitForChild("Track") -- 赛道起始点位
local lastDy=TrackAttRoot:GetAttribute("Dt")-- 多赛道之间的偏移量
local StartPlatformList={}
local StartPlatformPerfab=Workspace:WaitForChild("StartPlatform") --放置车辆平台
local Tool=	_G.CommonOHOH.load.RngTool()

local function CreateStartPlatform(att)
    if not  StartPlatformPerfab:GetAttribute("isUsing") then
        StartPlatformPerfab:PivotTo(att.WorldCFrame)
        StartPlatformList[att]=StartPlatformPerfab
        StartPlatformPerfab:SetAttribute("isUsing",true)
    else
        local plat= StartPlatformPerfab:Clone()
        plat.Parent=workspace
        plat:PivotTo(att.WorldCFrame)
        StartPlatformList[att]=plat
    end
end

local function GetTrackAtt() --获取赛道位置
    local list=TrackAttRoot:GetDescendants()
    for _,v in pairs(list) do
        if not v:GetAttribute("isUsing") then
            v:SetAttribute("isUsing",true)
            if not StartPlatformList[v] then
                CreateStartPlatform(v)
            end
            return  v
        end
    end
   local att=Instance.new("Attachment",TrackAttRoot)
   att.CFrame=CFrame.new(lastDy*(#list))
   att:SetAttribute("isUsing",true)

   if not StartPlatformList[att] then
        CreateStartPlatform(att)
    end

    return att
end

local OrbitList=game.ReplicatedStorage.Orbit.Ordinary --管道

-- 轨道对象
function M.new(...)
	return M(...);
end;

-- 返回一个管道实例 参数：管道序列ID
--规则：
-- 尾数0：直
--尾数1： 下
--尾数2：上
local maxDown=game_cfg.MaxOrbitY --向下最大深度

function M.GetOneOrbitInstance(self,sortId)
    -- local path=self.CId.."_"..self.LevelIndex.."_"
    local path=self.CId.."_1_"

    if sortId==1 then --返回直的
        path= path.."0"
    else  
        local v=math.random(1,100)
        if v<25 then --25%概率是直的
            path= path.."0"
        elseif  v<70 then--（70-25)% 概率是向下
            if self.OrbitY+1>maxDown then
                 path= path.."2"
                 self.OrbitY= self.OrbitY-1 --向上，深度-1
            else
                path= path.."1"
                self.OrbitY=self.OrbitY+1 --向下，深度+1
            end
        else --（100-70)% 概率是向上
            path= path.."2"
            self.OrbitY= self.OrbitY-1  --向上，深度-1
        end
    end
    local list=OrbitList:FindFirstChild(path):GetChildren()
    local index=math.random(1,#list)
    return list[index]:Clone()

    -- return OrbitList:FindFirstChild(path):Clone()
end;

-- 每个场景，存在5关
local gLevelCount=game_cfg.ChapterLevelCount

--参数：配置表中的关卡Id
function M.ctor(self,leveld)--构造函数
	M.super.ctor(self);
    local cid=math.ceil(leveld/gLevelCount)
    self.CId=cid
    self.LevelId=leveld
    self.LevelIndex=gLevelCount-(self.CId*gLevelCount-self.LevelId)
    self.cfg=level_cfg[self.LevelId]
    self.Att=GetTrackAtt()

    self.OrbitY=0 --轨道向下的深度

    self.OrbitList={}

    local sortId=1 --表示第几条管道
    local orbit= OrbitClass.new(self:GetOneOrbitInstance(sortId),self) --生成第一条管道
    orbit:Installation(self.Att.WorldCFrame) --设置管道位置
    orbit:SetSortId(sortId) --设置管道序列
    orbit:LoadMine()--加载矿石
    -- orbit.CreateNextOrbitEvent:Connect(function()
    --     self:CreateNextOrbit(orbit)
    -- end)
    self.OrbitList[sortId]=orbit
end;


function M.dtor(self)

    self.Att:SetAttribute("isUsing",false)
    for k,v in pairs(self.OrbitList) do
        if v then
            v:dtor()
        end
    end
    self.OrbitList={}

	M.super.dtor(self);
end;




--创建下一条管道
function M.CreateNextOrbit(self,lastOrbit)

    local orbit= OrbitClass.new(self:GetOneOrbitInstance(lastOrbit:GetSortId()+1),self) --生成第一条管道
    lastOrbit:AddNext(orbit)--将新管道连接到老管道
    orbit.CreateNextOrbitEvent:Connect(function() --监听生成下一条管道
        self:CreateNextOrbit(orbit)
    end)
    orbit:LoadMine()--加载管道

    local sortId=orbit:GetSortId()
    self.OrbitList[sortId]=orbit

    self:clearOrbitLessThanSortId(sortId-2)
end


-- sortId 小于 传入的 sortId，将被销毁
function M.clearOrbitLessThanSortId(self,sortId)

    local deleteId={}
    for k,v in pairs(self.OrbitList) do
        if k<sortId then
            v:dtor()
            table.insert(deleteId,k)
        end
    end

    for _,id in pairs(deleteId) do
        self.OrbitList[id]=nil
    end
end

-- 车的起始位置
function M.GetCarInitCFrame(self)
    return  StartPlatformList[self.Att].PlayerAtt.WorldCFrame
end

--创建矿石 参数： 管道序列ID，管道槽位索引
function M.CreateMine(self,srotId,k)

   local gtype=Tool.RandomLucky(self.cfg.weight)
   if gtype==1 then --矿石
        return    MineClass.new(self:GetId(self.cfg.mine))
   elseif gtype==2 then --宝箱
        return  BoxClass.new(self:GetId(self.cfg.box))
   end
end

function M.GetId(self,data)
    local p={}
    local index2ItemId={}

    local index=1
    for k,v in pairs(data) do
        p[index]=v
        index2ItemId[index]=k
        index=index+1
    end

    local index=Tool.RandomLucky(p)
    local id=index2ItemId[index]
    return id
end


-- -- 添加矿数据
-- function M.AddMineData(self,data)

--     --生成矿
--     local mineList=self:CreateMineObject(data)
--     local mineList=self:CreateMineObject(data)
--     -- 将矿铺到最后管道
--     local list=self.end_orbit:AddMine(mineList)
--     -- 创建新管道来铺剩余的
--     self:AddOrbit(list,self.end_orbit)
-- end

-- function M.CreateMineObject(self,dataList)

--     local list={}
--     for _,v in pairs(dataList) do
--         table.insert(list,MineClass.new(v))
--     end
--     return list
-- end


--  --创建新管道，铺矿
-- function M.AddOrbit(self,mineList,LastOrbit)
--     if #mineList==0 then
--        self.end_orbit=LastOrbit --款数据已经被清空，该管道为最后的管道
--        return 
--     end
--     local o= OrbitClass.new(self:GetOneOrbitInstance(1))

--     LastOrbit:AddNext(o) --连接到上一条管道

--     local list= o:AddMine(mineList)
--     self:AddOrbit(list,o)
-- end





return M